package com.hospital.register.order.service;

import java.util.Date;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hospital.register.dto.order.OrderDayDto;
import com.hospital.register.dto.order.OrderPageDto;
import com.hospital.register.dto.order.OrderSubmissionDto;
import com.hospital.register.model.order.RefundInfo;
import com.hospital.register.vo.order.OrderDaysVo;
import com.hospital.register.vo.order.OrderQueryVo;

/**
 * 处理订单业务
 *
 * @author 刘逸晖
 */
public interface OrderInfoService {

    /**
     * 提交订单
     *
     * @param submission 订单信息
     * @return 订单的 id
     */
    Long submit(OrderSubmissionDto submission);

    /**
     * 根据 id 查询订单
     *
     * @param id 订单的 id
     * @return 订单信息
     */
    OrderQueryVo selectById(Long id);

    /**
     * 分页查询订单列表
     *
     * @param page       页码和每页记录数
     * @param conditions 条件
     * @return 订单列表
     */
    Page<OrderQueryVo> selectPage(Page<OrderQueryVo> page, OrderPageDto conditions);

    /**
     * 根据订单 id 更新状态
     *
     * @param id          订单的 id
     * @param orderStatus 订单的新状态
     * @return 是否更新成功
     */
    boolean updateStatusById(Long id, Byte oldOrderStatus, Byte newOrderStatus, Date updateTime);

    /**
     * 开始取消订单
     * 检查订单是否可以取消，如果可以则新增退款记录
     *
     * @param userId      用户的 id
     * @param orderId     订单的 id
     * @param paymentType 支付类型
     * @return 退款记录
     */
    RefundInfo beginCancel(Long userId, Long orderId, Byte paymentType);

    /**
     * 完成取消订单
     * 通知医院
     * 向微信支付发起退款请求
     * 将退款记录的状态改为已取消
     * 向 mq 发送消息，通知系统模块更新号源
     * 更新订单状态为已取消
     *
     * @param orderId    订单的 id
     * @param refundInfo 新增的退款信息
     */
    void finishCancel(Long orderId, RefundInfo refundInfo);

    /**
     * 统计每日预约数
     *
     * @param conditions 统计的参数
     * @return 每日预约数
     */
    OrderDaysVo countEveryDayOrder(OrderDayDto conditions);

}
